package dao;

import banco.ConnectionDB;
import model.Produto;
import java.awt.Frame;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class ProdutoDAOImp implements GenericDAOImp<Produto> {

    private Frame frame;
    private Connection connection;

    public ProdutoDAOImp(Frame frame) {
        this.frame = frame;

        connection = new ConnectionDB().getConnection();
    }

    @Override
    public void adiciona(Produto produto) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "INSERT INTO produto (produto_ID, nome, descricao, preco, quantidade) "
                    + "VALUES (?, ?, ?, ?, ?)");

            statement.setInt(1, produto.getProdutoID());
            statement.setString(2, produto.getNome());
            statement.setString(3, produto.getDescricao());
            statement.setDouble(4, produto.getPreco());
            statement.setInt(5, produto.getQuantidade());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void altera(Produto produto) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "UPDATE produto SET nome = ?, "
                    + "descricao = ?, preco = ?, "
                    + "quantidade = ? "
                    + "WHERE produto_ID = ?");

            statement.setString(1, produto.getNome());
            statement.setString(2, produto.getDescricao());
            statement.setDouble(3, produto.getPreco());
            statement.setInt(4, produto.getQuantidade());
            statement.setInt(5, produto.getProdutoID());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            System.out.println("Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void remove(Object iD) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "DELETE FROM produto "
                    + "WHERE produto_ID = ?");

            statement.setObject(1, iD);

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Produto listaPorID(Object iD) {
        try {
            Produto produto = null;
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nome, descricao, preco, quantidade "
                    + "FROM produto "
                    + "WHERE produto_ID = ?");

            statement.setObject(1, iD);

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                produto = new Produto();
                produto.setProdutoID((Integer) iD);
                produto.setNome(resultSet.getString(1));
                produto.setDescricao(resultSet.getString(2));
                produto.setPreco(resultSet.getDouble(3));
                produto.setQuantidade(resultSet.getInt(4));
            }

            resultSet.close();
            statement.close();

            return produto;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Produto consultaSeta(String iD, int seta) {
        try {
            Produto produto = null;
            String query = "SELECT produto_ID, nome, descricao, preco, quantidade "
                    + "FROM produto ";
            PreparedStatement statement = null;

            switch (seta) {
                case 1:
                    statement = connection.prepareStatement(
                            query + "ORDER BY produto_ID;");

                    break;
                case 2:
                    statement = connection.prepareStatement(
                            query + "WHERE produto_ID < ? "
                            + "ORDER BY produto_ID DESC;");

                    statement.setString(1, iD);

                    break;
                case 3:
                    statement = connection.prepareStatement(
                            query + "WHERE produto_ID > ? "
                            + "ORDER BY produto_ID;");

                    statement.setString(1, iD);

                    break;
                case 4:
                    statement = connection.prepareStatement(
                            query + "ORDER BY produto_ID DESC;");

                    break;
            }

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                produto = new Produto();

                produto.setProdutoID(resultSet.getInt(1));
                produto.setNome(resultSet.getString(2));
                produto.setDescricao(resultSet.getString(3));
                produto.setPreco(resultSet.getDouble(4));
                produto.setQuantidade(resultSet.getInt(5));
            }

            resultSet.close();
            statement.close();

            return produto;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame,
                    "Erro ao executar comando no banco de dados!\n"
                    + "O programa vai ser fechado.\n\nErro ocorrido:\n"
                    + sQLException.getMessage());

            System.exit(0);

            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public List<Produto> listaTudo() {
        try {
            List<Produto> produtos = new ArrayList<Produto>();

            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nome, descricao, preco, quantidade "
                    + "FROM produto "
                    + "ORDER BY produto_ID");

            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {

                Produto produto = new Produto();

                produto.setNome(resultSet.getString(1));
                produto.setDescricao(resultSet.getString(2));
                produto.setPreco(resultSet.getDouble(3));
                produto.setQuantidade(resultSet.getInt(4));

                produtos.add(produto);
            }

            resultSet.close();
            statement.close();

            return produtos;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public int consultaProximoID() {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT * "
                    + "FROM produto "
                    + "ORDER BY produto_ID DESC");

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {
                return resultSet.getInt(1) + 1;
            }

            resultSet.close();
            statement.close();

            return 1;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }
}
